#!/bin/bash

#CONSTANTES #############
CONFFILE=~/.grupo08/InstalaW5.conf
DEF_LOGEXT=".log"
DEF_MAXLOGSIZE="1 Kb"
DEF_MAEDIR="../mae/"

#Tipo de mensaje
INFO="I"
ALERTA="A"
ERROR="E"
ERROR_SEVERO="ES"

#Comandos
INICIAR="IniciarW5"
DETECTAR="DetectaW5"
BUSCAR="BuscarW5"
LISTAR="ListarW5"
MIRAR="MirarW5"
MOVER="MoverW5"
#########################

#Se obtiene valores de configuracion
if [ -f "$CONFFILE" ]
then
	LOGEXT=$(cat "$CONFFILE" |grep "LOGEXT" | cut -f2 -d '=')
	LOGDIR=$(cat "$CONFFILE" | grep "LOGDIR" | cut -f2 -d '=') 
	MAXLOGSIZE=$(cat "$CONFFILE" | grep "LOGSIZE" | cut -f2 -d '=') 
	MAEDIR=$(cat "$CONFFILE" | grep "MAEDIR" | cut -f2 -d '=') 
else
	LOGEXT="$DEF_LOGEXT"
	LOGDIR="$PWD"
	MAXLOGSIZE="$DEF_MAXLOGSIZE"
	MAEDIR="$DEF_MAEDIR"
fi

#Funcion para reducir el archivo de log en caso de exceso - formato de llamada: reduceTamanio $1
#NOTA: $1 = <LOGDIR>/<Comando><LOGEXT>
function reduceTamanio() {
#calculo la cantidad de lineas que posee el archivo de log.
numLineas=`wc -l "$1"`

#elimino la ruta del archivo, es decir <LOGDIR>/<Comando><LOGEXT>, de la variable $numLineas.
numLineas=`echo "$numLineas" | sed "s- .*$LOGEXT--"`

mitad=$(expr "$numLineas" / 2)

#copy paste de la segunda mitad del archivo en un archivo temporal.
tail -"$mitad" "$1" > tmp

#piso el archivo original con el nuevo archivo truncado.
mv tmp "$1"
}

#Funcion Principal - formato de llamada: LoguearW5 $1 $2 "$3"
#validacion de parametros
if [ $# -ne 3 ]; then
	echo "Cantidad de parámetros incorrecta."
	echo "Uso 1: LoguearW5 [Comando] [Tipo de Mensaje] [ID de Mensaje]."
	echo "Uso 2: LoguearW5 [Comando] [Tipo de Mensaje] [Mensaje]"
	echo " Tipo de Mensaje: $INFO | $ALERTA | $ERROR | $ERROR_SEVERO."
	exit 1
fi

comando=$1
#validacion del comando.
if [ "$comando" != "$INICIAR" -a "$comando" != "$DETECTAR" -a "$comando" != "$BUSCAR" -a "$comando" != "$LISTAR" -a "$comando" != "$MIRAR" -a "$comando" != "$MOVER" ]; then
	echo "Comando inválido. Primer parámetro debe ser $INICIAR | $DETECTAR | $BUSCAR | $LISTAR | $MIRAR | $MOVER."
	exit 1
fi

tipo=`echo $2 | tr "[:lower:]" "[:upper:]"`
#validacion del tipo de mensaje.
if [ "$tipo" != "$INFO" -a "$tipo" != "$ALERTA" -a "$tipo" != "$ERROR" -a "$tipo" != "$ERROR_SEVERO" ]; then
	echo "Tipo de mensaje inválido. Segundo parámetro debe ser $INFO | $ALERTA | $ERROR | $ERROR_SEVERO."
	exit 1
fi

#obtengo el ultimo numero de mensaje en el archivo de mensajes
MAX_MENSAJES=$(cat "$MAEDIR/Mensajes.mae" | tail -1 | cut -f1 -d '-') 
#validacion del mensaje
if [[ "$3" == [0-9]* ]]; then
	if [[ "$3" -le "$MAX_MENSAJES" ]]; then
		mensaje=`cat "$MAEDIR/Mensajes.mae" | grep "$3" | cut -f2 -d '-' `
	else
		echo "Número de mensaje inválido. El máximo ID de mensaje es $MAX_MENSAJES."
		exit 1
	fi
else
#Si el mensaje tienen un "-" lo cambio por un"_" ya que el anterior es el separador de campos
	mensaje=$(echo "$3" | sed 's/-/_/g')
	if [ ${#mensaje} -gt 120 ]; then
   		echo "El mensaje no puede exceder los 120 caracteres de longitud."
		exit 1
	fi
fi

#Si el directorio donde se guardan los log no existe lo creo
if [ ! -d "$LOGDIR" ]; then
	mkdir "$LOGDIR"
fi

#armo la linea a escribir en el log.
linea="`date +'%x %T'`-$USERNAME-$comando-$tipo-$mensaje"
echo "$linea" >> "$LOGDIR/$comando$LOGEXT"

#elimino Kb de la variable $MAXLOGSIZE.
MAXLOGSIZE=`echo "$MAXLOGSIZE" | sed "s- Kb--"`

#paso la variable $MAXLOGSIZE de Kilobytes a Bytes.
MAXLOGSIZE=$(expr "$MAXLOGSIZE" "*" 1024)

#verifico el tamaño del log.
size=`wc -c "$LOGDIR/$comando$LOGEXT"`
size=`echo "$size" | sed "s- .*$LOGEXT--"`
if [ "$size" -ge "$MAXLOGSIZE" ]; then
	linea="`date +'%x %T'`-$USERNAME-$comando-$ALERTA-Log Excedido."
	echo "$linea" >> "$LOGDIR/$comando$LOGEXT"
	reduceTamanio "$LOGDIR/$comando$LOGEXT"
fi

exit 0
